<?php

namespace App\Exceptions;

use Exception;

/**
 * Class ApiException
 *
 * @package App\Exceptions
 */
class BaseException extends Exception
{
    // 在控制发送消息的对应code的位置和对应的值
    const SEND_MSG_POSITION_OF_CODE = 0;    // code加工起始位置：判断是否发送消息
    const SEND_MSG_CODE_NOT         = 1;    // 不发消息
    const SEND_MSG_CODE_YES         = 2;    // 发消息

    // 默认code和msg
    const DEFAULT_EXCEPTION_CODE = 509;
    const DEFAULT_EXCEPTION_MSG  = '出现错误，请稍后再试！';

    const CUSTOMIZE_CODE_TMP = 1024;    // 定制错误码： 临时

    /**
     * 异常类分组
     */
    const BASE_CODE_OF_API        = 10; // API
    const BASE_CODE_OF_LOGIN      = 20; // 登录
    const BASE_CODE_OF_ADMIN      = 30; // 后台
    const BASE_CODE_OF_COLLECTION = 40; // 藏品

    /**
     * @tips 错误码说明： 10 -- 1|2 -- 001
     *       10：exception类型
     *       1|2：是否发送报警消息,1-不发，2-发
     *       1001：具体的错误原因： 不发
     *       2001：具体的错误原因： 发
     * @var int
     */
    protected int $baseCode = 10;

    /**
     * 自定义码对应的错误信息
     *    key: 自定义code
     *    value:接口错误输出文案
     *
     * @var array
     */
    protected array $showMsg = [];

    /**
     * 定制错误码：自定义消息
     *
     * @var array
     */
    protected array $customizeCode = [
        self::CUSTOMIZE_CODE_TMP,
    ];


    /**
     * BaseException constructor.
     *
     * @param string $msg  异常的错误信息
     * @param int    $code 异常的错误code
     */
    function __construct(string $msg, int $code)
    {
        parent::__construct($msg, $code);
    }

    /**
     * 获取全部的自定义错误信息
     *
     * @return array
     */
    protected function getAllShowMsg(): array
    {
        return $this->showMsg;
    }


    /**
     * 获取完整的code码
     *
     * @param int $exCode
     *
     * @return int
     */
    public function getFullCode(int $exCode): int
    {
        return intval($this->baseCode . $exCode);
    }

    /**
     * 获取showMsg数据
     *
     * @param int $exCode
     * @return string
     */
    public function getShowMsg(int $exCode): string
    {
        $allShowMsg = $this->getAllShowMsg();
        return $allShowMsg[$exCode] ?? self::DEFAULT_EXCEPTION_MSG;
    }

    /**
     * 检测是否定制错误码
     *
     * @param int $exCode
     * @return bool
     */
    public function checkCustomizeCode(int $exCode): bool
    {
        return in_array($exCode, $this->customizeCode);
    }

}
